#include "epoller.hpp"
#include "util.hpp"
#include "ThreadPool.hpp"

ThreadPool* tp;

#include "app_interface.hpp"
using namespace ns_appinterface;

int main(int argc, char* argv[])
{
  if (argc != 2){
    std::cout << "Usage: " << argv[0] << " port" << std::endl;  
    exit(5);
  }
  uint16_t port = atoi(argv[1]);  
  // 创建套接字
  int listen_sock = ns_sock::Sock::CreateSocket();
  // 绑定
  ns_sock::Sock::Bind(listen_sock, port);
  // 监听
  ns_sock::Sock::Listen(listen_sock, BACKLOG);
  // 线程池
  tp = new ThreadPool;
  tp->ThreadPoolInit();
  // 创建事件管理器
  ns_epoll::Epoller* epoller = new ns_epoll::Epoller;
  epoller->InitEpoller();// 创建epoll模型
  ns_util::SetNoBlock(listen_sock);
  // 为监听套接字创建相关事件
  ns_epoll::EventItem event_item;
  
  event_item._sock = listen_sock;
  event_item._R = epoller;
  event_item.ManagerCallBack(accepter, nullptr, nullptr);
  
  // 把监听套接字添加到事件管理器中
  epoller->AddEvents(listen_sock, event_item, EPOLLIN|EPOLLET);

  int timeout = -1;
  // 死循环调用事件分配器
  while (1){
    epoller->Dispatcher(timeout);
  }

  return 0;
}
